﻿using DevelopTool.Common;
using System.Windows.Forms;
using System;

public static class TabControlHelper
{
    private static int _titleSubLength = 18; // 默认标签文本截断长度

    /// <summary>
    /// 将窗体添加到 TabControl 中作为 TabPage
    /// </summary>
    /// <param name="tabControl">要添加页面的 TabControl 控件</param>
    /// <param name="pageControl">要添加的窗体或控件</param>
    /// <param name="pageTitle">窗体或控件的标题</param>
    /// <param name="openOne">是否只打开唯一窗口（如果为 true，则根据 pageFlag 控制唯一性）</param>
    /// <param name="pageFlag">窗口或控件的唯一标识</param>
    /// <param name="titleSubLength">标签文本超长时截断字符数量，默认为 14</param>
    public static void AddPageToTabControl(TabControl tabControl,Control pageControl,string pageTitle,bool openOne = false,string pageFlag = "")
    {
        // 如果 openOne 为 true，则查找已存在的相同 pageFlag 的 TabPage
        if(openOne)
        {
            foreach(TabPage page in tabControl.TabPages)
            {
                if(page.Tag != null)
                {
                    // 判断 Tag 类型，可能是 Tuple<string, string> 或 string
                    if(page.Tag is Tuple<string,string> tuple && pageFlag == tuple.Item2)
                    {
                        tabControl.SelectTab(page); // 跳转到此 tab 窗口
                        return; // 不执行下面的逻辑
                    }
                    else if(page.Tag is string tagStr && pageFlag == tagStr)
                    {
                        tabControl.SelectTab(page); // 跳转到此 tab 窗口
                        return; // 不执行下面的逻辑
                    }
                }
            }
        }

        // 处理标签文本超长时的截断
        string title = TruncateString(pageTitle,_titleSubLength);

        Tuple<string,string> tagTuple = new Tuple<string,string>(pageTitle,pageFlag);
        // 创建新的 TabPage 控件
        TabPage tabPage = new TabPage(title)
        {
            Tag = tagTuple // 设置标签的唯一标识
        };

        tabPage.TextChanged += TabPage_TextChanged;

        // 设置窗体或控件的基本属性
        if(pageControl is Form pageForm)
        {
            pageForm.TopLevel = false; // 设置窗体为非顶级窗体
            pageForm.FormBorderStyle = FormBorderStyle.None; // 设置窗体边框为无边框
            pageForm.Text = pageTitle; // 设置窗体标题
        }

        // 将窗体或控件添加到 tabPage 中
        pageControl.Parent = tabPage;
        pageControl.Dock = DockStyle.Fill; // 填充 tabPage 控件
        pageControl.Show(); // 显示窗体或控件

        // 将 tabPage 添加到 tabControl 中并选中该页
        tabControl.TabPages.Add(tabPage);
        tabControl.SelectTab(tabPage);

        // 设置系统主题
        ThemHelper.SetSystemThem(pageControl); // 设置系统主题
    }

    /// <summary>
    /// 处理 TabPage 文本变化事件，确保标签文本超长时进行截断
    /// </summary>
    private static void TabPage_TextChanged(object sender,EventArgs e)
    {
        TabPage tabPage = (TabPage)sender;

        if(tabPage.Tag is Tuple<string,string> tagTuple)
        {
            string title = tabPage.Text;

            // 判断标签文本长度是否超过截断长度
            if(title.Length > _titleSubLength)
            {
                tabPage.Tag = new Tuple<string,string>(title,tagTuple.Item2); // 更新 Tag

                tabPage.TextChanged -= TabPage_TextChanged; // 移除事件处理程序

                tabPage.Text = TruncateString(title,_titleSubLength); // 截断文本

                tabPage.TextChanged += TabPage_TextChanged; // 重新添加事件处理程序
            }
        }
    }

    /// <summary>
    /// 截断字符串，考虑中文字符的长度
    /// </summary>
    /// <param name="input">输入的字符串</param>
    /// <param name="length">截断长度</param>
    /// <returns>截断后的字符串</returns>
    private static string TruncateString(string input,int length)
    {
        // 如果输入的字符串长度小于等于截断长度，直接返回原字符串
        if(input.Length <= length)
        {
            return input;
        }
        else
        {
            int byteLength = 0;
            int charLength = 0;

            // 遍历字符串，计算字符长度（考虑中文字符的情况）
            foreach(char c in input)
            {
                byteLength += StringHelper.GetStrLength(c.ToString());
                charLength++;

                // 如果字节长度超过截断长度，则返回前面的字符部分
                if(byteLength > length)
                {
                    return input.Substring(0,charLength - 1) + "..";
                }
            }

            // 默认情况下返回原字符串
            return input;
        }
    }



    /// <summary>
    /// 将窗体添加到指定的控件中
    /// </summary>
    /// <param name="control">要添加窗体的控件</param>
    /// <param name="pageForm">要添加的窗体</param>
    public static void AddFormToControl(Control control,Form pageForm)
    {
        control.Controls.Clear(); // 清空控件中的所有子控件

        pageForm.TopLevel = false; // 设置窗体为非顶级窗体
        pageForm.Parent = control; // 设置窗体的父控件为指定的 control
        pageForm.FormBorderStyle = FormBorderStyle.None; // 设置窗体边框为无边框
        pageForm.Dock = DockStyle.Fill; // 填充指定的控件

        ThemHelper.SetSystemThem(pageForm); // 设置系统主题

        pageForm.Show(); // 显示窗体

        control.Controls.Add(pageForm); // 将窗体添加到指定的控件中
    }
}
